from examples.example_3_simplest_case_priority_resource.ex_3_model_classes import Trial, g
from vidigi.prep import reshape_for_animations, generate_animation_df
from vidigi.animation import generate_animation
from vidigi.animation import animate_activity_log
import pandas as pd
import plotly.io as pio
pio.renderers.default = "notebook"
my_trial = Trial()
my_trial.run_trial()
my_trial.all_event_logs.head(50 )
0
1
2
arrival_departure
arrival
0.000000
NaN
0
1
1
2
queue
treatment_wait_begins
0.000000
NaN
0
2
1
2
resource_use
treatment_begins
0.000000
1.0
0
3
2
2
arrival_departure
arrival
3.399660
NaN
0
4
2
2
queue
treatment_wait_begins
3.399660
NaN
0
5
2
2
resource_use
treatment_begins
3.399660
2.0
0
6
3
2
arrival_departure
arrival
8.497645
NaN
0
7
3
2
queue
treatment_wait_begins
8.497645
NaN
0
8
3
2
resource_use
treatment_begins
8.497645
3.0
0
9
4
2
arrival_departure
arrival
8.596678
NaN
0
10
4
2
queue
treatment_wait_begins
8.596678
NaN
0
11
4
2
resource_use
treatment_begins
8.596678
4.0
0
12
5
2
arrival_departure
arrival
8.608025
NaN
0
13
5
2
queue
treatment_wait_begins
8.608025
NaN
0
14
6
2
arrival_departure
arrival
11.359739
NaN
0
15
6
2
queue
treatment_wait_begins
11.359739
NaN
0
16
7
2
arrival_departure
arrival
19.509442
NaN
0
17
7
2
queue
treatment_wait_begins
19.509442
NaN
0
18
8
2
arrival_departure
arrival
22.877356
NaN
0
19
8
2
queue
treatment_wait_begins
22.877356
NaN
0
20
9
2
arrival_departure
arrival
26.653863
NaN
0
21
9
2
queue
treatment_wait_begins
26.653863
NaN
0
22
1
2
resource_use_end
treatment_complete
40.317385
1.0
0
23
1
2
arrival_departure
depart
40.317385
NaN
0
24
5
2
resource_use
treatment_begins
40.317385
1.0
0
25
10
2
arrival_departure
arrival
40.737793
NaN
0
26
10
2
queue
treatment_wait_begins
40.737793
NaN
0
27
2
2
resource_use_end
treatment_complete
42.443230
2.0
0
28
2
2
arrival_departure
depart
42.443230
NaN
0
29
6
2
resource_use
treatment_begins
42.443230
2.0
0
30
4
2
resource_use_end
treatment_complete
48.809628
4.0
0
31
4
2
arrival_departure
depart
48.809628
NaN
0
32
7
2
resource_use
treatment_begins
48.809628
4.0
0
33
3
2
resource_use_end
treatment_complete
51.483457
3.0
0
34
3
2
arrival_departure
depart
51.483457
NaN
0
35
8
2
resource_use
treatment_begins
51.483457
3.0
0
36
11
2
arrival_departure
arrival
71.026558
NaN
0
37
11
2
queue
treatment_wait_begins
71.026558
NaN
0
38
5
2
resource_use_end
treatment_complete
77.447488
1.0
0
39
5
2
arrival_departure
depart
77.447488
NaN
0
40
9
2
resource_use
treatment_begins
77.447488
1.0
0
41
6
2
resource_use_end
treatment_complete
83.962251
2.0
0
42
6
2
arrival_departure
depart
83.962251
NaN
0
43
10
2
resource_use
treatment_begins
83.962251
2.0
0
44
12
2
arrival_departure
arrival
87.458700
NaN
0
45
12
2
queue
treatment_wait_begins
87.458700
NaN
0
46
13
2
arrival_departure
arrival
87.465138
NaN
0
47
13
2
queue
treatment_wait_begins
87.465138
NaN
0
48
7
2
resource_use_end
treatment_complete
95.498040
4.0
0
49
7
2
arrival_departure
depart
95.498040
NaN
0
STEP_SNAPSHOT_MAX = 45
LIMIT_DURATION = g.sim_duration
WRAP_QUEUES_AT = 15
full_patient_df = reshape_for_animations(
event_log= my_trial.all_event_logs[my_trial.all_event_logs['run' ]== 1 ],
every_x_time_units= 2 ,
step_snapshot_max= STEP_SNAPSHOT_MAX,
limit_duration= LIMIT_DURATION,
debug_mode= True
)
full_patient_df.head(15 )
Iteration through minute-by-minute logs complete 18:07:18
Snapshot df concatenation complete at 18:07:19
0
2
1
1
resource_use
treatment_begins
0.000000
1.0
1
1.0
0
NaN
1
2
1
1
resource_use
treatment_begins
0.000000
1.0
1
1.0
2
NaN
2
2
1
1
resource_use
treatment_begins
0.000000
1.0
1
1.0
4
NaN
3
2
1
1
resource_use
treatment_begins
0.000000
1.0
1
1.0
6
NaN
4
2
1
1
resource_use
treatment_begins
0.000000
1.0
1
1.0
8
NaN
5
2
1
1
resource_use
treatment_begins
0.000000
1.0
1
1.0
10
NaN
6
2
1
1
resource_use
treatment_begins
0.000000
1.0
1
1.0
12
NaN
7
2
1
1
resource_use
treatment_begins
0.000000
1.0
1
1.0
14
NaN
8
5
2
2
resource_use
treatment_begins
12.021043
2.0
1
2.0
14
NaN
9
2
1
1
resource_use
treatment_begins
0.000000
1.0
1
1.0
16
NaN
10
5
2
2
resource_use
treatment_begins
12.021043
2.0
1
2.0
16
NaN
11
2
1
1
resource_use
treatment_begins
0.000000
1.0
1
1.0
18
NaN
12
5
2
2
resource_use
treatment_begins
12.021043
2.0
1
2.0
18
NaN
13
2
1
1
resource_use
treatment_begins
0.000000
1.0
1
1.0
20
NaN
14
5
2
2
resource_use
treatment_begins
12.021043
2.0
1
2.0
20
NaN
event_position_df = pd.DataFrame([
{'event' : 'arrival' ,
'x' : 50 , 'y' : 300 ,
'label' : "Arrival" },
# Triage - minor and trauma
{'event' : 'treatment_wait_begins' ,
'x' : 205 , 'y' : 275 ,
'label' : "Waiting for Treatment" },
{'event' : 'treatment_begins' ,
'x' : 205 , 'y' : 175 ,
'resource' :'n_cubicles' ,
'label' : "Being Treated" },
{'event' : 'exit' ,
'x' : 270 , 'y' : 70 ,
'label' : "Exit" }
])
Generate animation using the step-by-step functions
Using the three step-by-step functions allows us to intervene in the produced dataframe and manually take control of the icons in use.
This will allow us to show the high-priority patients with a unique icon so we can see their frequency and how they are handled in the final model.
full_patient_df_plus_pos = generate_animation_df(full_patient_df= full_patient_df,
event_position_df= event_position_df,
wrap_queues_at= WRAP_QUEUES_AT,
step_snapshot_max= STEP_SNAPSHOT_MAX,
gap_between_entities= 10 ,
gap_between_resources= 10 ,
gap_between_rows= 30 ,
debug_mode= True
)
full_patient_df_plus_pos.sort_values(['patient' , 'minute' ]).head(15 )
Placement dataframe finished construction at 18:07:19
10186
2
1
1
resource_use
treatment_begins
0.0
1.0
1
1.0
0
NaN
205
175.0
Being Treated
n_cubicles
205.0
0.0
🧔🏼
10187
2
1
1
resource_use
treatment_begins
0.0
1.0
1
1.0
2
NaN
205
175.0
Being Treated
n_cubicles
205.0
0.0
🧔🏼
10188
2
1
1
resource_use
treatment_begins
0.0
1.0
1
1.0
4
NaN
205
175.0
Being Treated
n_cubicles
205.0
0.0
🧔🏼
10189
2
1
1
resource_use
treatment_begins
0.0
1.0
1
1.0
6
NaN
205
175.0
Being Treated
n_cubicles
205.0
0.0
🧔🏼
10190
2
1
1
resource_use
treatment_begins
0.0
1.0
1
1.0
8
NaN
205
175.0
Being Treated
n_cubicles
205.0
0.0
🧔🏼
10191
2
1
1
resource_use
treatment_begins
0.0
1.0
1
1.0
10
NaN
205
175.0
Being Treated
n_cubicles
205.0
0.0
🧔🏼
10192
2
1
1
resource_use
treatment_begins
0.0
1.0
1
1.0
12
NaN
205
175.0
Being Treated
n_cubicles
205.0
0.0
🧔🏼
10193
2
1
1
resource_use
treatment_begins
0.0
1.0
1
1.0
14
NaN
205
175.0
Being Treated
n_cubicles
205.0
0.0
🧔🏼
10194
2
1
1
resource_use
treatment_begins
0.0
1.0
1
1.0
16
NaN
205
175.0
Being Treated
n_cubicles
205.0
0.0
🧔🏼
10195
2
1
1
resource_use
treatment_begins
0.0
1.0
1
1.0
18
NaN
205
175.0
Being Treated
n_cubicles
205.0
0.0
🧔🏼
10196
2
1
1
resource_use
treatment_begins
0.0
1.0
1
1.0
20
NaN
205
175.0
Being Treated
n_cubicles
205.0
0.0
🧔🏼
10197
2
1
1
resource_use
treatment_begins
0.0
1.0
1
1.0
22
NaN
205
175.0
Being Treated
n_cubicles
205.0
0.0
🧔🏼
10198
2
1
1
resource_use
treatment_begins
0.0
1.0
1
1.0
24
NaN
205
175.0
Being Treated
n_cubicles
205.0
0.0
🧔🏼
10199
2
1
1
resource_use
treatment_begins
0.0
1.0
1
1.0
26
NaN
205
175.0
Being Treated
n_cubicles
205.0
0.0
🧔🏼
10200
2
1
1
resource_use
treatment_begins
0.0
1.0
1
1.0
28
NaN
205
175.0
Being Treated
n_cubicles
205.0
0.0
🧔🏼
def show_priority_icon(row):
if "more" not in row["icon" ]:
if row["pathway" ] == 1 :
return "🚨"
else :
return row["icon" ]
else :
return row["icon" ]
full_patient_df_plus_pos = full_patient_df_plus_pos.assign(
icon= full_patient_df_plus_pos.apply (show_priority_icon, axis= 1 )
)
full_patient_df_plus_pos.head(15 )
0
155
49
2
queue
exit
206.540636
NaN
1
3.0
600
NaN
270
70.0
Exit
NaN
250.0
0.0
🧕🏾
1
155
49
2
queue
treatment_wait_begins
206.540636
NaN
1
27.0
208
NaN
205
305.0
Waiting for Treatment
NaN
95.0
1.0
🧕🏾
2
155
49
2
queue
treatment_wait_begins
206.540636
NaN
1
27.0
210
NaN
205
305.0
Waiting for Treatment
NaN
95.0
1.0
🧕🏾
3
155
49
2
queue
treatment_wait_begins
206.540636
NaN
1
27.0
212
NaN
205
305.0
Waiting for Treatment
NaN
95.0
1.0
🧕🏾
4
155
49
2
queue
treatment_wait_begins
206.540636
NaN
1
27.0
214
NaN
205
305.0
Waiting for Treatment
NaN
95.0
1.0
🧕🏾
5
155
49
2
queue
treatment_wait_begins
206.540636
NaN
1
27.0
216
NaN
205
305.0
Waiting for Treatment
NaN
95.0
1.0
🧕🏾
6
155
49
2
queue
treatment_wait_begins
206.540636
NaN
1
27.0
218
NaN
205
305.0
Waiting for Treatment
NaN
95.0
1.0
🧕🏾
7
155
49
2
queue
treatment_wait_begins
206.540636
NaN
1
27.0
220
NaN
205
305.0
Waiting for Treatment
NaN
95.0
1.0
🧕🏾
8
155
49
2
queue
treatment_wait_begins
206.540636
NaN
1
27.0
222
NaN
205
305.0
Waiting for Treatment
NaN
95.0
1.0
🧕🏾
9
155
49
2
queue
treatment_wait_begins
206.540636
NaN
1
27.0
224
NaN
205
305.0
Waiting for Treatment
NaN
95.0
1.0
🧕🏾
10
155
49
2
queue
treatment_wait_begins
206.540636
NaN
1
27.0
226
NaN
205
305.0
Waiting for Treatment
NaN
95.0
1.0
🧕🏾
11
155
49
2
queue
treatment_wait_begins
206.540636
NaN
1
27.0
228
NaN
205
305.0
Waiting for Treatment
NaN
95.0
1.0
🧕🏾
12
155
49
2
queue
treatment_wait_begins
206.540636
NaN
1
27.0
230
NaN
205
305.0
Waiting for Treatment
NaN
95.0
1.0
🧕🏾
13
155
49
2
queue
treatment_wait_begins
206.540636
NaN
1
27.0
232
NaN
205
305.0
Waiting for Treatment
NaN
95.0
1.0
🧕🏾
14
155
49
2
queue
treatment_wait_begins
206.540636
NaN
1
26.0
234
NaN
205
305.0
Waiting for Treatment
NaN
105.0
1.0
🧕🏾
generate_animation(
full_patient_df_plus_pos= full_patient_df_plus_pos.sort_values(['patient' , 'minute' ]),
event_position_df= event_position_df,
scenario= g(),
debug_mode= True ,
setup_mode= False ,
include_play_button= True ,
icon_and_text_size= 20 ,
plotly_height= 700 ,
frame_duration= 800 ,
frame_transition_duration= 200 ,
plotly_width= 1200 ,
override_x_max= 300 ,
override_y_max= 500 ,
time_display_units= "dhm" ,
display_stage_labels= False ,
add_background_image= "https://raw.githubusercontent.com/Bergam0t/vidigi/refs/heads/main/examples/example_1_simplest_case/Simplest%20Model%20Background%20Image%20-%20Horizontal%20Layout.drawio.png" ,
)
Output animation generation complete at 18:07:20
Rerun, but using the all-in-one animation function (which will not show different priority icons)
animate_activity_log(
event_log= my_trial.all_event_logs[my_trial.all_event_logs['run' ]== 1 ],
event_position_df= event_position_df,
scenario= g(),
debug_mode= True ,
setup_mode= False ,
every_x_time_units= 1 ,
include_play_button= True ,
icon_and_text_size= 20 ,
gap_between_entities= 6 ,
gap_between_rows= 25 ,
plotly_height= 700 ,
frame_duration= 200 ,
plotly_width= 1200 ,
override_x_max= 300 ,
override_y_max= 500 ,
limit_duration= g.sim_duration,
wrap_queues_at= 25 ,
step_snapshot_max= 125 ,
time_display_units= "dhm" ,
display_stage_labels= False ,
add_background_image= "https://raw.githubusercontent.com/Bergam0t/vidigi/refs/heads/main/examples/example_1_simplest_case/Simplest%20Model%20Background%20Image%20-%20Horizontal%20Layout.drawio.png" ,
)
Animation function called at 18:07:20
Iteration through minute-by-minute logs complete 18:07:22
Snapshot df concatenation complete at 18:07:22
Reshaped animation dataframe finished construction at 18:07:22
Placement dataframe finished construction at 18:07:22
Output animation generation complete at 18:07:24
Total Time Elapsed: 4.32 seconds